package com.yanjue.common.util;

import com.yanjue.common.constant.JwtConstant;
import com.yanjue.common.entity.User;
import com.yanjue.common.vo.account.UserVO;
import io.jsonwebtoken.*;

import java.util.Date;

public class JwtUtil {

    /**
     * 构建JWT对象
     * @param expire
     * @param user
     * @return
     */
    public static String buildJwt(Date expire, UserVO user) {

        // ZGVmYXVsdC1zZWNyZXQtY29tcGxleC1tZWRpYS1kYXRhLXN0b3Jk

        /*//将jwt存入redis，有效期遵从常量 JwtConstant 七天过期，小说软件
        redisTemplate.opsForValue().set(LoginKeyPrefix.LOGIN_KEY ,token, EXPIRE_DAY, TimeUnit.DAYS);*/

        return Jwts.builder()
                // 使用HS256加密算法
                .signWith(SignatureAlgorithm.HS256, JwtConstant.SECRET_KEY)
                // 过期时间
                .setExpiration(expire)
                .claim("loginName", user.getLoginName())
                .claim("id", user.getId())
                .compact();
    }

    /**
     * 身份认证
     *
     * @param jwt 令牌
     * @return 成功状态返回200，其它均为失败
     */
    public static Result validationToken(String jwt) {
        try {
            //解析JWT字符串中的数据，并进行最基础的验证
            Claims claims = Jwts.parser()
                    .setSigningKey(JwtConstant.SECRET_KEY)
                    .parseClaimsJws(jwt)
                    .getBody();

            User user = new User();
            user.setLoginName(claims.get("loginName").toString());
            user.setNickName(claims.get("nickName").toString());
            if (claims.get("phoneNumber") != null) {
                user.setPhoneNumber(claims.get("phoneNumber").toString());
            }
            user.setId(Integer.parseInt(claims.get("id").toString()));
            user.setHeadImgUrl(claims.get("headImgUrl").toString());
            return ResultUtil.success(user);
        } catch (ExpiredJwtException e) {
            // 已过期令牌
            return ResultUtil.authExpired();
        } catch (SignatureException e) {
            // 伪造令牌
            return ResultUtil.unAuthorized();
        } catch (Exception e) {
            // 系统错误
            return ResultUtil.unAuthorized();
        }
    }
}
